<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>

        // 映射规则
        const KV = [
            0,
            1, // 墙
            2, // 
            3, // 门
            4,
            5,

            1, // "我", "我", 0xffffff, 10, 5, 100, 1, 100);
            1001, // "兵", "杂兵", 0xffffff, 10, 3, 100, 1, 100);
            1002, // "守", "守卫", 0xffffff, 15, 6, 50, 1, 80);
            1003, // "牢", "牢头", 0xffffff, 10, 5, 100, 1, 100);
            1004, // "狱", "典狱长", 0xff3333, 40, 5, 100, 1, 100);
            // 2001, // "骑", "骑兵", 0xffffff, 20, 5, 100, 2, 120);
            2002, // "弓", "弓手", 0xffffff, 10, 3, 120, 4, 80);
            2003, // "猎", "赏金猎人", 0xffffff, 50, 5, 120, 4, 120);
            0, // 留白
            0, // 留白
            0, // 留白

            1, // "★", "通用货币", 0xe8e8e8, Item_Key);
            10201, // "◆", "地牢钥匙", 0x00adef, Item_Key);
            20101, // "剑", "铁剑", Item_Weapon, ItemLv_1);	   // 最低数值
            20102, // "剑", "精铁剑", Item_Weapon, ItemLv_2);	   // 均衡
            20103, // "尺", "玄铁尺", Item_Weapon, ItemLv_2);	   // 攻速慢伤害高
            20104, // "刃", "冰刃", Item_Weapon, ItemLv_3);	   // 冰霜附魔
            20105, // "弓", "烈焰弓", Item_Weapon, ItemLv_3);	   // 火焰附魔，远程
            20106, // "斧", "风暴战斧", Item_Weapon, ItemLv_3);  // 范围打击
            20107, // "雷", "雷劫", Item_Weapon, ItemLv_99);	   // 中等范围，蓄能，越久伤害、范围越高
            20108, // "星", "星辰", Item_Weapon, ItemLv_99);	   // 超远程，攻速很快，穿透
            20109, // "噬", "噬魂", Item_Weapon, ItemLv_99);	   // 攻击吸血，但是防御减少
            20201, // "甲", "皮甲", Item_Armor, ItemLv_1);	  // 最低数值
            20202, // "甲", "锁子甲", Item_Armor, ItemLv_2);	  // 均衡
            // 20203, // "甲", "板甲", Item_Armor, ItemLv_3);	  // 较高防御，移速固定最低值
            // 20204, // "衣", "灵巧披风", Item_Armor, ItemLv_3);  // 较低防御，增加移速、攻速
            // 20205, // "甲", "龙鳞甲", Item_Armor, ItemLv_99);	  // 略高防御，增加暴击
            20301, // "戒", "速度戒指", Item_Accessory, ItemLv_2);  // 提升攻速和移速
            20302, // "环", "生命吊坠", Item_Accessory, ItemLv_2);  // 持续恢复生命
            20303, // "戒", "根骨之戒", Item_Accessory, ItemLv_3);  // 提升攻击力
            20304, // "戒", "智慧之戒", Item_Accessory, ItemLv_3);  // 提升属性伤害
            30101, // "草", "药草，回复生命", 0x32cd32, Item_Grass);
            30102, // "花", "急速花，暂时提升移速", 0xe8e8e8, Item_Grass);
            30103, // "心", "生命之心，提升生命上限", 0xe00000, Item_Grass);
            30201, // "药", "治疗药水", 0x32cd32, Item_Posion);
            30202, // "药", "持续治疗药水", 0x33ccaa, Item_Posion);
            30203, // "剂", "铁皮药剂", 0x999999, Item_Posion);
            30204, // "剂", "愤怒药剂", 0xff99aa, Item_Posion);
            30301, // "传", "传送卷轴", 0xe8e8e8, Item_Scroll);	 // 传送到屏幕外的附近区域
            30302, // "回", "回城卷轴", 0xe8e8e8, Item_Scroll);	 // 回到上一个存档点
            30303, // "护", "护身卷轴", 0xe8e8e8, Item_Scroll);	 // 击退自身周围单位
            30304, // "影", "分身卷轴", 0xe8e8e8, Item_Scroll);	 // 制造一个分身
            30305, // "爆", "自爆卷轴", 0xd9004c, Item_Scroll);	 
            0, // 留白
        ];

        let pushInt = (v, arr) => {
            arr.push(v & 0x0000ff);
            arr.push((v & 0x00ff00) >> 8);
            arr.push((v & 0xff0000) >> 16);
            arr.push(0);
        };

        // 获取对象
        let pushObjs = (data, w) => {
            let arr = [];
            data.forEach((e, i) => {
                const y = Math.floor(i / w);
                const x = i - y * w;
                if (e) {
                    pushInt(KV[e], arr);
                    pushInt(x, arr);
                    pushInt(y, arr);
                    console.log(x, y, e, KV[e]);
                }
            });
            return arr;
        };

        // 获取二进制的地图
        let getBitsMap = (name, data) => {
            // 定义结构：00 00 00 00 00 AA ...
            // 前4位width+height，后面是地图
            for (l of data.layers) {
                switch (l.name) {
                    case "map": { // 砖块图层
                        let arr = [];
                        arr.push(l.width);
                        arr.push(l.height);
                        for (const d of l.data) {
                            arr.push(d);
                        }
                        console.log("地图大小", l.width, l.height);


                        let bytes = new Uint8Array(arr.length);
                        arr.forEach((e, i) => bytes[i] = e);
                        save(bytes, "1_map.bin");
                        break;
                    }
                    case "items": { // 物品图层
                        let arr = pushObjs(l.data, l.width);
                        console.log("物品个数", arr / 3 / 4, arr);

                        let bytes = new Uint8Array(arr.length);
                        arr.forEach((e, i) => bytes[i] = e);
                        save(bytes, "1_items.bin");
                        break;
                    }
                    case "roles": {// 角色图层
                        let arr = pushObjs(l.data, l.width);
                        console.log("角色个数", arr / 3 / 4, arr);

                        let bytes = new Uint8Array(arr.length);
                        arr.forEach((e, i) => bytes[i] = e);
                        save(bytes, "1_roles.bin");
                        break;
                    }
                }
            }
        };

        let save = async (data, name) => {
            const a = document.createElement("a");
            const blob = new Blob([data], { type: 'text/plain' });
            a.href = URL.createObjectURL(blob);
            a.download = name;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
        };

        window.onTileMapLoaded = getBitsMap;
    </script>
    <script src="1.js"> </script>
</body>

</html>